## 7.4. Variables

Variables are prefaced by a dollar sign ($) and optionally enclosed in braces ({}). You can assign a value to a variable through an equals sign (=); no whitespace can appear on either side of the equals sign:

>     $ TMP=temp.file

By default, variables are seen only within the shell itself; to pass variables to other programs invoked within the shell, see the export built-in command.

If subscripted by brackets ([]), the variable is considered an array variable. For instance:

>     $ DIR_LIST[0]=src
>     $ DIR_LIST[1]=headers
>     $ ls ${DIR_LIST[1]}

The contents of headers are listed. Many substitutions and commands in this chapter handle arrays by operating on each element separately.

This subsection describes:

- Variable substitution

- Built-in shell variables

### 7.4.1. Variable Substitution

In the following substitutions, braces ({ }) are optional, except when needed to separate a variable name from following characters that would otherwise be considered part of the name.

Variable | Meaning
--- | ---
`${`var`}` | The value of variable var.
`$0` | Name of the program.
`${`n`}` | Individual arguments on command line (positional parameters); 1 n 9.
`$#` | Number of arguments on command line.
`$*` | All arguments on command line.
`$@` | Same as `$*` but contents are split into words when the variable is enclosed in double quotes.
`$$` | Process number of current shell; useful as part of a filename for creating temporary files with unique names.
`$?` | Exit status of last command (normally 0 for success).
`$!` | Process number of most recently issued background command.
`$-` | Current execution options (see the set built-in command). By default, hB for scripts and himBH for interactive shells.
`$_` | Initially set to name of file invoked for this shell, then set for each command to the last word of the previous command.

Table 7-16 through Table 7-18 show various types of operators that can be used with bash variables.

#### Table 7-16. Substitution Operators

Operator | Substitution
--- | ---
${varname:-word} | If varname exists and isn't null, return its value; otherwise, return word.
Purpose: | Returning a default value if the variable is undefined.
Example: | ${count:-0} evaluates to 0 if count is undefined.
${varname:=word} | If varname exists and isn't null, return its value; otherwise set it to word and then return its value. Positional and special parameters cannot be assigned this way.
Purpose: | Setting a variable to a default value if it is undefined.
Example: | ${count:=0} sets count to 0 if it is undefined.
${varname:?message} | If varname exists and isn't null, return its value; otherwise, print varname: followed by message, and abort the current command or script (noninteractive shells only). Omitting message produces the default message "parameter null or not set."
Purpose: | Catching errors that result from variables being undefined.
Example: | {count:?"undefined!"} prints ``count: undefined!'' and exits if count is undefined.
${varname:+word} | If varname exists and isn't null, return word; otherwise, return null.
Purpose: | Testing for the existence of a variable.
Example: | ${count:+1} returns 1 (which could mean true) if count is defined.
${#varname} | Return the number of characters in varname.
Purpose: | Preparing for substitution or extraction of substrings.
Example: | If ${USER} currently expands to root, ${#USER} expands to 4.

#### Table 7-17. Pattern-Matching Operators

Operator | Meaning
--- | ---
${variable#pattern} | If the pattern matches the beginning of the variable's value, delete the shortest part that matches and return the rest.
${variable##pattern} | If the pattern matches the beginning of the variable's value, delete the longest part that matches and return the rest.
${variable%pattern} | If the pattern matches the end of the variable's value, delete the shortest part that matches and return the rest.
${variable%%pattern} | If the pattern matches the end of the variable's value, delete the longest part that matches and return the rest.
${var/pat/sub} | Return var with the first occurrence of pat replaced by sub. Can be applied to $* or $@, in which case each word is treated separately. If pat starts with # it can match only the start of var; if pat ends with % it can match only the end of var.
${var//pat/sub} | Return var with the every occurrence of pat replaced by sub.
${variable:n} | Truncate the beginning of the variable and return the part starting with character number n, where the first character is 0.
${variable:n:l} | Starting with character number n, where the first character is 0, return a substring of length l from the variable.

#### Table 7-18. Expression Evaluation

Operator | Meaning
--- | ---
$((arithmetic-expression)) | Return the result of the expression. Arithmetic operators are described under "Arithmetic Expressions."
Example: | TODAY=`'`date +%-d`'` ; echo $(($TODAY+7)) stores the number of the current day in $TODAY and then prints that number plus 7 (the number of the same day next week).
[[$condition]] | Return 1 if condition is true and 0 if it is false. Conditions are described under the test built-in command.

### 7.4.2. Built-in Shell Variables

Built-in variables are set automatically by the shell and typically are used inside shell scripts. Built-in variables can make use of the variable substitution patterns already shown earlier. When setting variables, you do not include dollar signs, but when referencing their values later, the dollar signs are necessary.

Tables Table 7-19 through Table 7-22 show the commonly used built-in variables in bash.

#### Table 7-19. Behavior-Altering Variables

Variable | Meaning
auto_resume | Allows a background job to be brought to the foreground simply by entering a substring of the job's command line; values can be substring (resume if the user's string matches part of the command); exact (string must exactly match command); or another value (string must match at beginning of command).
BASH_ENV | Startup file of commands to execute, if bash is invoked to run a script.
CDPATH | Colon-separated list of directories to search for the directory passed in a cd command.
EDITOR | Pathname of your preferred text editor.
IFS | Word separator; used by shell to parse commands into their elements.
IGNOREEOF | If nonzero, don't allow use of a single Ctrl-D (the end-of-file or EOF character) to log off; use the exit command to log off.
PATH | Colon-separated list of directories to search for each command.
PROMPT_COMMAND | Command that bash executes before issuing a prompt for a new command.
PS1 | Prompt displayed before each new command; see the later section Section 7.6.4, "Variables in Prompt" for ways to introduce dynamically changing information such as the current working directory or command history number into the prompt.
PS2 | Prompt displayed before a new line if a command is not finished.
PS3 | Prompt displayed by select built-in command.
PS4 | Prompt displayed by -x debugging (see Section 7.2, "Invoking the Shell"). and the set built-in command).

#### Table 7-20. History Variables

Variable | Meaning
--- | ---
FCEDIT | Pathname of editor to use with the fc command.
HISTCMD | The history number of the current command.
HISTCONTROL | If HISTCONTROL is set to the value of ignorespace, lines beginning with a space are not entered into the history list. If set to ignoredups, lines matching the last history line are not entered. Setting it to ignoreboth enables both options.
HISTFILE | Name of history file, on which the editing modes operate.
HISTFILESIZE | The maximum number of lines to store in the history file. The default is 500.
HISTSIZE | The maximum number of commands to remember in the command history. The default is 500.

#### Table 7-21. Mail Variables

Variable | Meaning
MAIL | Name of file to check for incoming mail.
MAILCHECK | How often, in seconds, to check for new mail (default is 60 seconds).
MAILPATH | List of filenames, separated by colons (:), to check for incoming mail.

#### Table 7-22. Status Variables

Variable | Meaning
BASH | Pathname of this instance of the shell you are running.
BASH_VERSION | The version number of the shell you are running.
COLUMNS | The number of columns your display has.
DIRSTACK | List of directories manipulated by pushd and popd commands.
EUID | Effective user ID of process running this shell, in the form of the number recognized by the system.
GROUPS | Groups to which user belongs, in the form of the numbers recognized by the system.
HOME | Name of your home (login) directory.
HOSTNAME | Host the shell is running on.
HOSTTYPE | Short name indicating the type of machine the shell is running on; for instance, i486.
LINES | The number of lines your display has.
MACHTYPE | Long string indicating the machine the shell is running on; for instance, i486-pc-linux-gnu.
OLDPWD | Previous directory before the last cd command.
OSTYPE | Short string indicating the operating system; for instance, "linux-gnu."
PPID | Process ID of parent process that invoked this shell.
PWD | Current directory.
SECONDS | Number of seconds since the shell was invoked.
SHELL | Pathname of the shell you are running.
SHLVL | Depth to which running shells are nested.
TERM | The type of terminal that you are using.
UID | Real user ID of process running this shell, in the form of the number recognized by the system.

Copyright © 2001 O'Reilly & Associates. All rights reserved.